﻿
using Estoque.Core.Negocio;
using Estoque.Core.Negocio.Enumeradores;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Estoque.Core.Mapeadores
{
    public class MapeadorDeCidade
    {
        private const string SQL_CONSULTE_TODAS = "SELECT CIDACODIGO, CIDADESCRICAO, CIDAUF FROM TBCIDADE";
        private const string INSERT = "INSERT INTO TBCIDADE (CIDACODIGO, CIDADESCRICAO, CIDAUF) VALUES({0} , {1} ,{2})";
        private const string UPDATE = "UPDATE TBCIDADE SET CIDADESCRICAO = {0}, CIDAUF={1} WHERE CIDACODIGO={2}";
        private const string DELETE = "DELETE FROM TBCIDADE WHERE CIDACODIGO = {0}";

        internal int ObtenhaProximoCodigo()
        {
            return DBHelper.Instancia.GetNextCode("CIDACODIGO", "TBCIDADE");
        }

        private Dictionary<int, Cidade> _cache = new Dictionary<int, Cidade>();

        internal void Modifique(Cidade cidade)
        {
            DBHelper.Instancia.ExecuteNonQuery(string.Format(UPDATE, DBHelper.PrepareString(cidade.Nome), cidade.UF.Codigo, cidade.Codigo));
        }
        internal void Insira(Cidade cidade)
        {
            DBHelper.Instancia.ExecuteNonQuery(string.Format(INSERT, cidade.Codigo, DBHelper.PrepareString(cidade.Nome), cidade.UF.Codigo));
        }
        internal void Exclua(int codigo)
        {
            DBHelper.Instancia.ExecuteNonQuery(string.Format(DELETE, codigo));
        }
        internal static Cidade Mapeie(DBDataReader dr)
        {

            Cidade cidade = new Cidade();
            cidade.Codigo = dr.GetInteger("CIDACODIGO");
            cidade.Nome = dr.GetString("CIDADESCRICAO");
            cidade.UF = EnumeradorDeUF.Obtenha(dr.GetInteger("CIDAUF"));
            return cidade;
        }

        public Cidade Consulte(int Codigo)
        {
            Cidade cidade = null;

            if (_cache.TryGetValue(Codigo, out cidade))
                return cidade;

            using (DBDataReader dr = DBHelper.Instancia.ExecuteReader("SELECT CIDACODIGO, CIDADESCRICAO, CIDAUF FROM TBCIDADE WHERE CIDACODIGO = " + Codigo.ToString()))
            {
                if (dr.Read())
                {
                    cidade = new Cidade();
                    cidade.Codigo = dr.GetInteger("CIDACODIGO");
                    cidade.Nome = dr.GetString("CIDADESCRICAO");
                    cidade.UF = EnumeradorDeUF.Obtenha(dr.GetInteger("CIDAUF"));

                    _cache[cidade.Codigo] = cidade;
                }
            }

            return cidade;
        }



        public List<Cidade> ConsulteTodos()
        {
            List<Cidade> cidades = new List<Cidade>();

            using (DBDataReader dr = DBHelper.Instancia.ExecuteReader(SQL_CONSULTE_TODAS))
            {
                while (dr.Read())
                {
                    cidades.Add(Mapeie(dr));
                }
            }

            return cidades;
        }
        public List<Cidade> ConsulteTodos(string Iniciais)
        {
            List<Cidade> cidades = new List<Cidade>();
            string FinalSQL = " ORDER BY CIDADESCRICAO";
            if (!string.IsNullOrEmpty(Iniciais))
                FinalSQL = " WHERE CIDADESCRICAO LIKE '" + Iniciais.ToUpper().Trim() + "%'";

            using (DBDataReader dr = DBHelper.Instancia.ExecuteReader(SQL_CONSULTE_TODAS + FinalSQL, 25))
            {
                while (dr.Read())
                {
                    cidades.Add(Mapeie(dr));
                }
            }

            return cidades;
        }
    }
}
